//类的装饰器  语法糖 用来装饰类
//类的装饰器 可以装饰类的本身（参数就是类） 类的属性 类的方法 静态属性 类中的函数的参数都可以使用
function addSay(target: Function) {
    target.prototype.say = function () {
        console.log('say');
    }
}

function toUpper(isUpper: boolean) {
    //target 原型 key属于实例
    return function (target: any, key: string) {
        setTimeout(() => {
            console.log(target[key]);
        }, 1000);
    }
}

function Enum(isEum: boolean) {
    return function (target: any,key:any,descriptor:PropertyDescriptor) {
        descriptor.enumerable = isEum
    }
}

@addSay //addSay(Animal)
class Animal {
    say!: Function
    @toUpper(false)
    public name: string = 'jiangwen'

    get myname() {//如果想给原型添加属性 可以使用属性访问器
        return 'abc'
    }
    @Enum(false)
    public eat() {//原型上？如何声明原型上的属性

    }
}

@addSay
class Person {
}

let animal = new Animal;
let person = new Person;
console.log(animal);

//类的装饰器实验性语法 不建议使用 后续会更改 stage-3 react mobx next.js 可以不用就是语法糖
//ts中对this推断比较弱 所以尽量不要使用
export { }